package dominioDoProblema;

import dominioDaSolucao.Tetris;

public class GerenciadorTetramino {

	protected Tetramino proximoTetramino;
	protected Tetramino tetraminoDaVez;
	protected Tetris tetris;
	
	public GerenciadorTetramino(Tetris tetris) {
		this.tetris = tetris;
	}

	public Tetramino getTetraminoDaVez() {
		return this.tetraminoDaVez;
	}

	public void setTetraminoDaVez(Tetramino tetraminoDaVez) {
		this.tetraminoDaVez = tetraminoDaVez;
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		quedaTetramino();
	}

	public Tetramino getProxTetramino() {
		return this.proximoTetramino;
	}

	public void setProximoTetramino(Tetramino proximoTetramino) {
		this.proximoTetramino = proximoTetramino;
	}

	public void criaTetraminoPreview(String jogDaVez, int cor) {
		tetris.getPreview().resetArea();
		Tetramino tetramino = new Tetramino(tetris.getPreview().getQuadrado(1,
				1), tetris.getPreview(), jogDaVez, cor);
		this.setProximoTetramino(tetramino);
		tetris.getPreview().repaint();
	}

	public void criaTetraminoDaVez(String jogDaVez, int cor) {
		tetris.getTabuleiro().resetArea();
		Tetramino tetramino = new Tetramino(tetris.getTabuleiro().getQuadrado(
				1, 4), tetris.getTabuleiro(), jogDaVez, cor);
		this.setTetraminoDaVez(tetramino);
		tetris.getTabuleiro().repaint();
	}

	public void initTetraminos(String jogDaVez, int cor) {
		criaTetraminoPreview(jogDaVez, cor);
		criaTetraminoDaVez(jogDaVez, cor);
	}

	public void atualizarTetraminos(String jogDaVez, int cor) {
		if (proximoTetramino != null) {
			tetraminoDaVez = proximoTetramino;
			proximoTetramino.apagarAntigos();
			Tabuleiro tab = tetris.getTabuleiro();
			tetraminoDaVez.setMatriz(tab);
			tetraminoDaVez.atualizarQuadradoReferencia();
			criaTetraminoPreview(jogDaVez, cor);
		}
	}

	public void recebeTetramino(String jogDaVez, int cor) {
		atualizarTetraminos(jogDaVez, cor);
		tetraminoDaVez.redesenharQuadrados();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		quedaTetramino();
	}

	public void quedaTetramino() {
		PeriodicChecker pc = new PeriodicChecker();
		Thread t = new Thread(pc);
		t.start();
	}
	
	public void girar() {
		if (tetraminoDaVez != null) {
			tetraminoDaVez.girar();
		}
	}

	public void deslocarParaDireita() {
		if (tetraminoDaVez != null) {
			tetraminoDaVez.deslocarParaDireita();
		}
	}

	public void deslocarParaEsquerda() {
		if (tetraminoDaVez != null) {
			tetraminoDaVez.deslocarParaEsquerda();
		}
	}

	public void acelerarQueda() {
		if (tetraminoDaVez != null) {
			tetraminoDaVez.acelerarQueda();
		}
	}

	public void reset() {
		proximoTetramino = null;
		tetraminoDaVez = null;
	}
	
	public class PeriodicChecker implements Runnable {
		@Override
		public void run() {
			boolean emQueda = tetraminoDaVez.acelerarQueda();
			while (tetraminoDaVez != null && emQueda)
				try {
					Thread.sleep(1000);
					if (tetraminoDaVez != null) {
						emQueda = tetraminoDaVez.acelerarQueda();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			if (!emQueda) {
				tetris.enviarJogada(tetraminoDaVez.getNomeJogador(),
						tetraminoDaVez.getXRef(), tetraminoDaVez.getYRef(),
						tetraminoDaVez.getTipo(),
						tetraminoDaVez.getOrientacao(),
						tetraminoDaVez.getCor(), 1);
			}
		}
	}

}